namespace :fix do
  desc "Recolecta todas las preguntas de la evaluacion 360 con id 4\n 
    y las agrupa por el metodo 'all_data'; que contiene todos los valores relevantes de la pregunta;\n
    por cada par de preguntas duplicadas, busca las respuestas y las agrupa por el metodo usuario_y_evaluado\n
    Asi tenemos las respuestas duplicadas a una 'misma pregunta' realizada por un evaluador (usuario) a un evaluado\n
    Del par de respuestas selecciona la de mayor valor y elimina la pregunta"
  task :duplicadas => :environment do
    puts "Starting"
    group_to_destroy=[]
    preguntas={}
    Evaluacion.find(4).preguntas.collect{|p| preguntas[p.all_data].nil? ? preguntas[p.all_data]=[p.id] : preguntas[p.all_data]<<p.id }
    preguntas_duplicadas = preguntas.reject { |key,value| value.count<2  }
    preguntas_duplicadas.each do |all_data,preguntas_ids|
      puts "\nPreguntas => #{preguntas_ids.inspect}"
      puts "_____________________________________"
      respuestas=Respuesta.find_all_by_pregunta_id(preguntas_ids).group_by(&:usuario_y_evaluado)
      pre_elegida_id=preguntas_ids.first
      pre_rechazada_id=preguntas_ids.second
      if respuestas.blank?
        pregunta_to_delete=Pregunta.find(pre_rechazada_id)
        pregunta_to_keep=Pregunta.find(pre_elegida_id)
#        puts "Will KEEP #{pregunta_to_keep.id}; Its has #{pregunta_to_keep.respuestas.count} respuestas\n"
#        puts "Will destroy #{pregunta_to_delete.id}; Its has #{pregunta_to_delete.respuestas.count} respuestas\n\n"
        group_to_destroy<<pre_rechazada_id
      end      
      respuestas.each do |ue,respuestas_ue|       
        if respuestas_ue.count>1
          if respuestas_ue.first.valor > respuestas_ue.second.valor
            res_elegida=respuestas_ue.first
            res_rechazada=respuestas_ue.second
#            puts "Respuesta ELEGIDA #{res_elegida.valor}"
#            puts "Respuesta rechazada #{res_rechazada.valor}"
            res_elegida.pregunta_id=pre_elegida_id
            res_rechazada.pregunta_id=pre_rechazada_id
          else
            res_elegida=respuestas_ue.second
            res_rechazada=respuestas_ue.first
#            puts "Respuesta ELEGIDA #{res_elegida.valor}"
#            puts "Respuesta rechazada #{res_rechazada.valor}"
            res_elegida.pregunta_id=pre_elegida_id
            res_rechazada.pregunta_id=pre_rechazada_id
          end          
          res_elegida.save
          res_rechazada.save          
        elsif respuestas_ue.count==1
          res_elegida=respuestas_ue.first
#          puts "Respuesta ELEGIDA #{res_elegida.valor}"
          res_elegida.pregunta_id=pre_elegida_id
          res_elegida.save
        end
        pregunta_to_delete=Pregunta.find(pre_rechazada_id)
        pregunta_to_keep=Pregunta.find(pre_elegida_id)
#        puts "Will KEEP #{pregunta_to_keep.id}; Its has #{pregunta_to_keep.respuestas.count} respuestas\n"
#        puts "Will destroy #{pregunta_to_delete.id}; Its has #{pregunta_to_delete.respuestas.count} respuestas\n\n"
        group_to_destroy<<pre_rechazada_id
      end
    end  
    puts "Grupo to destroy => #{group_to_destroy.sort.uniq.inspect}"
    group_to_destroy.uniq.each do |pregunta_id|
      p=Pregunta.find(pregunta_id)
      p.destroy
    end
    puts "Total duplicadas #{preguntas_duplicadas.count}"    
  end
end